/*Using LVGL with Arduino requires some extra steps:
 *Be sure to read the docs here: https://docs.lvgl.io/master/get-started/platforms/arduino.html  */

#include <lvgl.h>
#include <TFT_eSPI.h>

#include"lv_port_indev.h"



#include "gui_guider.h"
#include "events_init.h"
lv_ui guider_ui;

//#define CLK 6
//#define DT 10
//#define SW 9

 /*bool pressed(){
    if(!digitalRead(SW)){
      delay(50);
      if(!digitalRead(SW))
      return true;
    }
      else return false;
    }
*/

///////////////////////////////////////////////////////////////////////////
//#include "generated/gui_guider.h"
//#include "generated/events_init.h"

/////////////////////////////////////////////////////////////////////////////


/*To use the built-in examples and demos of LVGL uncomment the includes below respectively.
 *You also need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`.
 Note that the `lv_examples` library is for LVGL v7 and you shouldn't install it for this version (since LVGL v8)
 as the examples and demos are now part of the main LVGL library. */

/*Change to your screen resolution*/
static const uint16_t screenWidth  = 240;
static const uint16_t screenHeight = 240;

static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[ screenWidth * screenHeight / 10 ];

TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */



/* Display flushing */
void my_disp_flush( lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p )
{
    uint32_t w = ( area->x2 - area->x1 + 1 );
    uint32_t h = ( area->y2 - area->y1 + 1 );

    tft.startWrite();
    tft.setAddrWindow( area->x1, area->y1, w, h );
    tft.pushColors( ( uint16_t * )&color_p->full, w * h, true );
    tft.endWrite();

    lv_disp_flush_ready( disp_drv );
}



//  io 9 是 按钮

 







//void encoder_with_keys_read(lv_indev_drv_t * drv, lv_indev_data_t*data){
  //data->key = last_key();            /*Get the last pressed or released key*/
                                     /* use LV_KEY_ENTER for encoder press */
  //if(key_pressed()) data->state = LV_INDEV_STATE_PRESSED;//  io 9 是 按钮
  //else {
      //data->state = LV_INDEV_STATE_RELEASED;
      /* Optionally you can also use enc_diff, if you have encoder*/
     // data->enc_diff = enc_get_new_moves();
 // }
//}






void setup()
{
  
    lv_init();
    tft.begin();          /* TFT init */
    tft.setRotation( 0 ); /* Landscape orientation, flipped */  //改变屏幕显示方向 0~3 顺时针旋转90度
    lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * screenHeight / 10 );
    /*Initialize the display*/
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init( &disp_drv );
    /*Change the following line to your display resolution*/
    disp_drv.hor_res = screenWidth; 
    disp_drv.ver_res = screenHeight;
    disp_drv.flush_cb = my_disp_flush;
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register( &disp_drv );

    

    /*Initialize the (dummy) input device driver*/
    /*static lv_indev_drv_t indev_drv;
    lv_indev_drv_init( &indev_drv );
    indev_drv.type = LV_INDEV_TYPE_ENCODER;
    indev_drv.read_cb = encoder_with_keys_read;
    */

     pinMode(8, OUTPUT);//8 为RGB灯
     lv_port_indev_init();//初始化lv_port_indev.h外部输入设备驱动
    








  
    /* Create simple label */

          //在屏幕中央产生文本
    
    //lv_obj_t *label = lv_label_create( lv_scr_act() );
    //lv_label_set_text( label, "Hello Ardino and LVGL!");
    //lv_obj_align( label, LV_ALIGN_CENTER,0,0);
  

 
    /* Try an example. See all the examples 
     * online: https://docs.lvgl.io/master/examples.html
     * source codes: https://github.com/lvgl/lvgl/tree/e7f88efa5853128bf871dde335c0ca8da9eb7731/examples */
     //lv_example_btn_1();
   
     /*Or try out a demo. Don't forget to enable the demos in lv_conf.h. E.g. LV_USE_DEMOS_WIDGETS*/
    //lv_demo_widgets();               
    // lv_demo_benchmark();          
    // lv_demo_keypad_encoder();     
    // lv_demo_music();              
    // lv_demo_printer();
    // lv_demo_stress();
    
    setup_ui(&guider_ui);
    events_init(&guider_ui);









}

void loop()
{
    
    
    lv_timer_handler(); /* let the GUI do its work */
   
       
   

    delay(5);


}
